@Transactional অ্যানোটেশন এর ব্যবহার

Java Technologies - স্প্রিং বুট জেপিএ (Spring Boot JPA) - Transaction Management
312

@Transactional অ্যানোটেশন Spring Framework-এর একটি গুরুত্বপূর্ণ অ্যানোটেশন যা transaction management এর জন্য ব্যবহৃত হয়। এটি ডাটাবেসের একাধিক অপারেশনকে একত্রে একটিমাত্র ট্রানজ্যাকশনে অন্তর্ভুক্ত করতে সাহায্য করে। Spring Data JPA-তে @Transactional ব্যবহার করলে, আপনি সহজেই ডাটাবেসের ওপরে ট্রানজ্যাকশন পরিচালনা করতে পারেন, যেমন commit বা rollback করার প্রক্রিয়া।

@Transactional এর উদ্দেশ্য

  • Atomicity: যখন একাধিক অপারেশন একটিতে সংঘটিত হয়, তখন @Transactional নিশ্চিত করে যে সমস্ত অপারেশন সঠিকভাবে সম্পন্ন হবে, অথবা কোনও একটি অপারেশন ব্যর্থ হলে, অন্য অপারেশনগুলো রোলব্যাক হবে।
  • Consistency: ডাটাবেসে ডেটা বজায় রাখতে এটি নিশ্চিত করে যে সমস্ত পরিবর্তনগুলি ডাটাবেসের কনসিস্টেন্ট স্টেটে থাকবে।
  • Isolation: একাধিক ট্রানজ্যাকশন একে অপরের মধ্যে একে অপরের ডেটা দেখতে পাবে না, এটি একটি ট্রানজ্যাকশনের মধ্যে সম্পন্ন হওয়া পরিবর্তনগুলো অন্য ট্রানজ্যাকশনে প্রভাব ফেলবে না।
  • Durability: একবার ট্রানজ্যাকশন সফলভাবে কমপ্লিট হলে, তার ফলাফল সিস্টেম ক্র্যাশ হলেও স্থায়ী থাকবে।

@Transactional এর ব্যবহার

@Transactional অ্যানোটেশনটি Service বা Repository ক্লাসের মেথডে ব্যবহৃত হয়, যাতে ডাটাবেসের একাধিক অপারেশনকে একটি ট্রানজ্যাকশনের মধ্যে আবদ্ধ করা যায়। Spring ট্রানজ্যাকশন পরিচালনা করার জন্য TransactionManager ব্যবহার করে।

@Transactional এর সাধারণ ব্যবহার

উদাহরণ 1: @Transactional ব্যবহার করা

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUserAndAddress(User user, Address address) {
        userRepository.save(user);
        address.setUser(user);
        // Address টেবিলে নতুন রেকর্ড ইনসার্ট করা হবে
        addressRepository.save(address);
    }
}

এখানে, @Transactional ব্যবহার করা হয়েছে, যাতে User এবং Address-এর ইনসার্ট অপারেশন একটি ট্রানজ্যাকশনে সম্পন্ন হয়। যদি কোনো একটি অপারেশন ব্যর্থ হয়, তাহলে অন্য সমস্ত অপারেশন rollback হয়ে যাবে।

উদাহরণ 2: @Transactional with Rollback

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderService {

    @Autowired
    private OrderRepository orderRepository;
    
    @Autowired
    private PaymentService paymentService;

    @Transactional(rollbackFor = Exception.class)
    public void placeOrder(Order order, Payment payment) throws Exception {
        orderRepository.save(order); // Save order
        paymentService.processPayment(payment); // Process payment

        if (payment.getAmount() < 0) {
            throw new Exception("Invalid payment amount");
        }
    }
}

এখানে, rollbackFor ব্যবহার করা হয়েছে যাতে Exception এর ক্ষেত্রে সমস্ত পরিবর্তন রোলব্যাক হয়ে যায়। অর্থাৎ, যদি পেমেন্টের পরিমাণ ভুল থাকে (যেমন, নেগেটিভ মান), তাহলে Order এবং Payment উভয়ই রোলব্যাক হবে।


@Transactional এর বিভিন্ন বৈশিষ্ট্য

1. readOnly

@Transactional(readOnly=true) ব্যবহার করে আপনি জানিয়ে দিতে পারেন যে ট্রানজ্যাকশনের মধ্যে শুধুমাত্র পড়ার (read) কাজ হবে, এবং কোনো লেখা (write) কাজ হবে না। এটি পারফরম্যান্স উন্নত করতে সাহায্য করে।

উদাহরণ:

@Transactional(readOnly = true)
public List<User> findAllUsers() {
    return userRepository.findAll();
}

এখানে, readOnly=true ব্যবহার করে শুধুমাত্র SELECT অপারেশন করার জন্য ট্রানজ্যাকশন চিহ্নিত করা হয়েছে, যার ফলে Hibernate বা JPA অপটিমাইজড ভাবে পারফরম্যান্স দিতে পারে।

2. propagation

propagation একটি ট্রানজ্যাকশনের আচরণ নির্ধারণ করে যখন আরেকটি ট্রানজ্যাকশন ইতিমধ্যে চলছে। এর মাধ্যমে আপনি ট্রানজ্যাকশন কীভাবে ব্যবহৃত হবে তা কাস্টমাইজ করতে পারেন। কিছু গুরুত্বপূর্ণ propagation স্তর:

  • REQUIRED: ডিফল্ট আচরণ, যদি কোনো ট্রানজ্যাকশন চলমান না থাকে তবে নতুন ট্রানজ্যাকশন শুরু হয়, অন্যথায় চলমান ট্রানজ্যাকশনকেই ব্যবহার করা হয়।
  • REQUIRES_NEW: প্রতিটি মেথডের জন্য নতুন ট্রানজ্যাকশন তৈরি হয়, চলমান ট্রানজ্যাকশনটি সাসপেন্ড করা হয়।
  • MANDATORY: চলমান ট্রানজ্যাকশন থাকতে হবে, অন্যথায় একটি IllegalStateException ছোড়া হবে।

উদাহরণ:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void processOrder(Order order) {
    orderRepository.save(order); // Start a new transaction for saving the order
}

3. isolation

isolation ট্রানজ্যাকশনের পর্যায় নির্ধারণ করে, অর্থাৎ একাধিক ট্রানজ্যাকশন একই সময়ে একে অপরের ডেটা দেখতে পাবে কি না। Spring-এর মধ্যে বেশ কিছু isolation স্তর রয়েছে, যেমন:

  • READ_COMMITTED: শুধুমাত্র ইতিমধ্যে কমিট করা ডেটাই অন্য ট্রানজ্যাকশন দেখবে।
  • READ_UNCOMMITTED: কোনো ডেটা কমিট হওয়ার আগে অন্য ট্রানজ্যাকশনও তা দেখতে পারবে।
  • SERIALIZABLE: সবচেয়ে কঠিন isolation স্তর, যেখানে একে একে ট্রানজ্যাকশন সম্পন্ন হয়।

উদাহরণ:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateProductPrice(Long productId, double price) {
    Product product = productRepository.findById(productId);
    product.setPrice(price);
    productRepository.save(product);
}

@Transactional এর অন্যান্য ব্যবহার

  • timeout: আপনি একটি ট্রানজ্যাকশনের জন্য একটি টাইমআউট নির্ধারণ করতে পারেন, যাতে নির্দিষ্ট সময়ের মধ্যে ট্রানজ্যাকশন শেষ না হলে তা রোলব্যাক হয়ে যায়।
  • rollbackFor: এই অপশন ব্যবহার করে আপনি নির্দিষ্ট Exception বা Throwable এর জন্য রোলব্যাক নির্ধারণ করতে পারেন।

উদাহরণ:

@Transactional(rollbackFor = SQLException.class)
public void processTransaction() throws SQLException {
    // Do some operations that might throw SQLException
}

এখানে, SQLException ঘটলে ট্রানজ্যাকশন রোলব্যাক হবে।


Conclusion

@Transactional অ্যানোটেশন Spring Boot JPA এবং Spring Data JPA-এর একটি অত্যন্ত গুরুত্বপূর্ণ অংশ, যা ডাটাবেস ট্রানজ্যাকশন ম্যানেজমেন্টকে সহজ এবং কার্যকর করে তোলে। এর মাধ্যমে আপনি Atomicity, Consistency, Isolation, এবং Durability (ACID) নিশ্চিত করতে পারেন। @Transactional ব্যবহার করে CRUD অপারেশন এবং জটিল ডাটাবেস লজিককে সহজে একত্রে পরিচালনা করা যায়। readOnly, propagation, isolation, এবং rollbackFor এর মতো অতিরিক্ত বৈশিষ্ট্যগুলি ব্যবহার করে আপনি আরও বেশি কাস্টমাইজেশন এবং নিয়ন্ত্রণ অর্জন করতে পারেন।


Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...